sortlistmodel: Use timsort
authorBenjamin Otte <otte@redhat.com>
Fri, 17 Jul 2020 00:47:22 +0000 (02:47 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 22 Jul 2020 12:04:40 +0000 (14:04 +0200)
Simply replace the old qsort() call with a timsort() call.

This is ultimately relevant because timsort is a LOT faster in merging
to already sorted lists (think items-chaged adding some items) or
reversing an existing list (think columnview sort order changes).

Benchmarks:

    initially sorting the model
                    qsort  timsort
    128,000 items   124ms    111ms
    256,000 items   264ms    250ms

gtk/gtksortlistmodel.c

index 93d51c5951555e648f12f649b66872e546efbbf9..cdfce89f01f702f4faf05ae92324c0d528646dee 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "gtkintl.h"
 #include "gtkprivate.h"
+#include "gtktimsortprivate.h"
 
 typedef struct _SortItem SortItem;
 struct _SortItem
@@ -176,11 +177,11 @@ sort_func (gconstpointer a,
 static void
 gtk_sort_list_model_resort (GtkSortListModel *self)
 {
-  g_qsort_with_data (sort_array_get_data (&self->items),
-                     sort_array_get_size (&self->items),
-                     sizeof (SortItem),
-                     sort_func,
-                     self->sorter);
+  gtk_tim_sort (sort_array_get_data (&self->items),
+                sort_array_get_size (&self->items),
+                sizeof (SortItem),
+                sort_func,
+                self->sorter);
 }
 
 static void